#!/usr/bin/env ruby
  
  require 'fox16'
  
  include Fox
  
  class InputHandlerWindow < FXMainWindow
  
  def initialize(app)
  # Initialize base class first
  super(app, "Input Handlers Test", :opts => DECOR_ALL, :width => 400, :height => 300)
  
  # Text area plus a button
  commands = FXHorizontalFrame.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
  FXLabel.new(commands, "Command:")
  @cmdInput = FXTextField.new(commands, 30, :opts => FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X)
  @cmdInput.connect(SEL_COMMAND, method(:onCmdText))
  FXHorizontalSeparator.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
  textFrame = FXVerticalFrame.new(self,
  FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
  
  # Output will be displayed in a multiline text area
  @cmdOutput = FXText.new(textFrame, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
  
  # Initialize the pipe
  @pipe = nil
  end
  
  # Create and show the main window
  def create
  super
  show(PLACEMENT_SCREEN)
  end
  
  # Remove previous input (if any)
  def closePipe
  if @pipe
  getApp().removeInput(@pipe, INPUT_READ|INPUT_EXCEPT)
  @pipe = nil
  end
  end
  
  def onCmdText(sender, sel, ptr)
  # Stop previous command
  closePipe
  
  # Clean up the output window
  @cmdOutput.text = ""
  
  # Open a new pipe
  @pipe = IO.popen(@cmdInput.text)
  
  # Register input callbacks and return
  getApp().addInput(@pipe, INPUT_READ|INPUT_EXCEPT) do |sender, sel, ptr|
  case FXSELTYPE(sel)
  when SEL_IO_READ
  text = @pipe.read_nonblock(256)
  if text && text.length > 0
  @cmdOutput.appendText(text)
  else
  closePipe
  end
  when SEL_IO_EXCEPT
  # puts 'onPipeExcept'
  end
  end
  return 1
  end
  end
  
  if $0 == __FILE__
  # Construct an application
  application = FXApp.new('InputHandler', 'FoxTest')
  
  # Construct the main window
  InputHandlerWindow.new(application)
  
  # Create and show the application windows
  application.create
  
  # Run the application
  application.run
  end